package common.server.utils;

import common.server.exception.ValidException;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * 校验帮助类
 * 
 * @Null 验证对象是否为空
 * @NotNull 验证对象是否为非空
 * @AssertTrue 验证 Boolean 对象是否为 true
 * @AssertFalse 验证 Boolean 对象是否为 false
 * @Min 验证 Number 和 String 对象是否大等于指定的值
 * @Max 验证 Number 和 String 对象是否小等于指定的值
 * @DecimalMin 验证 Number 和 String 对象是否大等于指定的值，小数存在精度
 * @DecimalMax 验证 Number 和 String 对象是否小等于指定的值，小数存在精度
 * @Size 验证对象（Array,Collection,Map,String）长度是否在给定的范围之内
 * @Digits 验证 Number 和 String 的构成是否合法
 * @Past 验证 Date 和 Calendar 对象是否在当前时间之前
 * @Future 验证 Date 和 Calendar 对象是否在当前时间之后
 * @Pattern 验证 String 对象是否符合正则表达式的规则
 * @author Administrator
 * @version [版本号, 2017/11/22 0022]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class ValidatorHelper {
	/**
	 * 校验工厂
	 */
	private static ValidatorFactory factory = Validation
			.buildDefaultValidatorFactory();

	public static <T> List<?> validate(T obj) {
		Validator validator = factory.getValidator();
		Set<ConstraintViolation<T>> set = validator.validate(obj);
		List<String> redultList = new ArrayList<>();
		if (set.size() > 0) {
			for (ConstraintViolation<T> val : set) {
				redultList.add(val.getMessage());
			}
		}
		return redultList;
	}

	/**
	 * 分组校验
	 * 
	 * @param obj
	 *            校验对象
	 * @param groups
	 *            组
	 * @param <T>
	 * @return
	 */
	public static <T> List<?> validate(T obj, Class<?>[] groups) {
		Validator validator = factory.getValidator();
		Set<ConstraintViolation<T>> set = validator.validate(obj, groups);
		List<String> redultList = new ArrayList<>();
		if (set.size() > 0) {
			for (ConstraintViolation<T> val : set) {
				redultList.add(val.getMessage());
			}
		}

		return redultList;
	}

	/**
	 * 当校验失败抛出异常
	 * 
	 * @param obj
	 * @param groups
	 * @param <T>
	 */
	public static <T> void validator(T obj, Class<?>[] groups) {
		List<?> list = validate(obj, groups);
		if (!list.isEmpty()) {
			throw new ValidException(list.toString());
		}
	}

	public static <T> void validator(T obj) {
		List<?> list = validate(obj);
		if (!list.isEmpty()) {
			throw new ValidException(list.toString());
		}
	}
}
